package com.gxar.quick.ar.server.base.common.utils;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.Base64;

public class ImageSplitUtils {

    public static void main(String[] args) {
        // 示例的 Base64 编码图像字符串
        String base64Image = "your_base64_image_string_here";

        // 切割图像并获取中心图片的 Base64 编码
        try {
            String centerBase64Image = splitImageAndGetCenterBase64(base64Image);
            System.out.println("中心图片的 Base64 编码: " + centerBase64Image);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 切割 Base64 编码的图像为九宫格，并返回中心图片的 Base64 编码。
     *
     * @param base64Image Base64 编码的图像
     * @return 中心图片的 Base64 编码
     * @throws IOException 处理图像时发生错误
     */
    public static String splitImageAndGetCenterBase64(String base64Image) throws IOException {
        // 将 Base64 编码解码为字节数组
        byte[] imageBytes = Base64.getDecoder().decode(base64Image);

        // 将字节数组转换为 BufferedImage
        try (ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes)) {
            BufferedImage image = ImageIO.read(inputStream);

            // 切割图像并获取中心图片
            BufferedImage centerImage = splitImageAndGetCenter(image);

            // 将中心图片转换为字节数组
            try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
                ImageIO.write(centerImage, "jpg", outputStream);
                byte[] centerImageBytes = outputStream.toByteArray();

                // 将字节数组编码为 Base64
                return Base64.getEncoder().encodeToString(centerImageBytes);
            }
        }
    }

    /**
     * 切割图像为九宫格，并返回中心图片。
     *
     * @param image 要切割的图像
     * @return 中心图片
     */
    public static BufferedImage splitImageAndGetCenter(BufferedImage image) {
        // 获取图像的宽度和高度
        int width = image.getWidth();
        int height = image.getHeight();

        // 计算每个九宫格的宽度和高度
        int cellWidth = width / 3;
        int cellHeight = height / 3;

        // 计算中心九宫格的起始坐标
        int startX = cellWidth;
        int startY = cellHeight;

        // 获取中心九宫格的子图像
        BufferedImage centerImage = image.getSubimage(startX, startY, cellWidth, cellHeight);

        return centerImage;
    }
}
